#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h> // file option
#include <dirent.h>
// #include <iostream>
// #include <sstream>
// #include <vector>
// #include <list>
// #include <map>
// #include <thread>
// #include <string>
// #include <iomanip>
// #include <fstream>
// #include <vector>
// #include <set>
// #include <algorithm>
// #include <unordered_map>
// #include <mutex>
// #include <atomic>
// #include <bits/wordsize.h>
// #include <bits/timesize.h>
using namespace std;

//指针，先介绍空间。
//程序空间好比一个大楼，有100个房间，我们把他编号为0-99。我们称0-99为地址。
//变量char a = 1;假设被分配到0地址的房间里面。那么0地址的空间中保存了1个字节，内容是1。我们对a操作，就是操作房间里面的哪个字节的值。
//数组char a[1] = {0};数组a就是一个常量地址，假设被分配在1空间，那么a的值为1房间号，而a[0]表示1房间号里面的值，为0.
//指针变量char *b = a;b等于a，表示b值为1房间号，内容和a一样为0。
//sizeof(b)==sizeof(a)，指针大小，在32系统为4字节，64位系统为8字节。
//对指针分配空间malloc，释放用free。因为堆空间不free，在程序结束才会释放，因此容易出现内存泄露，也是程序员最为头痛的事情。

//char **p, char (*p)[], char *p[], char p[][]
//char **p;也可表示为(char *)*p;为指向指针的指针，它为变量，也就是p为一个房间号2345，p保存的内容是另外一个房间号：如6789.
//char *p[];也可以表示为char *(p[]);指针数组(保存指针的数组)，p为常量，这个数组每个变量保存的是一个指针。char **p;与char *p[];表示一个东西，一个是变量，一个是常量。就像char a[1];和char *b = a;
//char p[][];二维数组，p是一个指针常量，指向二维数组
//char (*p)[];数组指针(保存数组的指针)，p是一个指针，指向一个数组。
//数组是常量，指针是变量！
//使用指针，初始化NULL， 使用一定检测是否为空。如果free，同时将指针=NULL，因为free不会将指针=null。不是malloc分配的，free会崩溃。

//指针+1表示
//指针内容有各自的空间，比如一个指针地址为0，内容大小为10，那么指针+1就为10。所有指针+1都遵循这个规则！！！！

//int *func1(void){}指针函数(返回指针的函数)
//typedef int *(*func2)(void);函数指针(指向函数的指针)

//指针函数
int *func1(void)
{
    printf("kfk\n");
    return NULL;
}
//函数指针
typedef int *(*func2)(void);
int main()
{
    char ap1[2][10];//常量
    //ap1一个空间的大小为10(10长度的数组)，因此ap1+1的值为：ap1=0x7fff9882e9a0,ap1+1=0x7fff9882e9aa
    printf("%p,%p\n", ap1, ap1 + 1);
    char (*p1)[10] = ap1;//变量
    printf("%p,%p\n", p1, p1 + 1);
    char *ap2[2];//还可以表示为char *(ap2[2]);是常量
    //ap2一个空间的大小为8(因为一个指针空间在我64位系统是8字节)，因此ap2+1的值为：ap2=0x7fff9882e9a0,ap2+1=0x7fff9882e9aa
    printf("%p,%p\n", ap2, ap2 + 1);
    // char *(ap2_1[2]);
    char **p2 = ap2;
    printf("%p,%p\n", p2, p2 + 1);

    func2 tmpf = func1;
    tmpf();//函数指针调用
    return 0;
}

//输出结果
// 0x7fff9882e9a0,0x7fff9882e9aa
// 0x7fff9882e9a0,0x7fff9882e9aa
// 0x7fff9882e990,0x7fff9882e998
// 0x7fff9882e990,0x7fff9882e998
// kfk


